# cmake_uninstall.cmake.in
# 增强版的CMake卸载脚本模板，具有更好的空目录处理能力
# 本文件是CMake生成的卸载脚本模板，用于根据install_manifest.txt中的记录卸载已安装的文件

# 检查安装清单文件是否存在
if(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
  message(FATAL_ERROR "Cannot find install manifest: @CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
endif()

# 读取安装清单文件内容并转换为列表
file(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files)
string(REGEX REPLACE "\n" ";" files "${files}")

# 初始化一个列表来跟踪需要检查的目录
set(directories_to_check "")

# 遍历所有需要卸载的文件
foreach(file ${files})
  # 处理DESTDIR环境变量前缀（用于交叉编译时的安装路径）
  set(full_path "$ENV{DESTDIR}${file}")
  message(STATUS "Uninstalling: ${full_path}")

  # 检查文件是否存在或是符号链接
  if(EXISTS "${full_path}" OR IS_SYMLINK "${full_path}")
    # 获取文件的绝对路径和父目录
    get_filename_component(abs_path "${full_path}" ABSOLUTE)
    get_filename_component(parent_dir "${abs_path}" DIRECTORY)

    # 删除文件或符号链接
    file(REMOVE "${abs_path}")

    # 验证是否删除成功
    if(EXISTS "${abs_path}" OR IS_SYMLINK "${abs_path}")
      message(FATAL_ERROR "Failed to remove: ${abs_path}")
    endif()

    # 添加所有父目录直到安装前缀，用于后续的空目录检查
    while(parent_dir)
      list(FIND directories_to_check "${parent_dir}" dir_index)
      if(dir_index EQUAL -1)
        list(APPEND directories_to_check "${parent_dir}")
      endif()
      
      # 到达安装前缀时停止
      if(parent_dir STREQUAL "$ENV{DESTDIR}@CMAKE_INSTALL_PREFIX@")
        break()
      endif()
      
      get_filename_component(parent_dir "${parent_dir}" DIRECTORY)
    endwhile()
  else()
    message(STATUS "File '${full_path}' does not exist")
  endif()
endforeach()

# 按目录深度排序（最深的目录优先）
list(SORT directories_to_check COMPARE STRING ORDER DESCENDING)

# 增强版的空目录删除函数
function(remove_empty_directories dir_list)
  # 初始化计数器
  set(removed_dirs 0)
  
  # 第一遍：删除明显为空的目录
  foreach(dir ${dir_list})
    if(IS_DIRECTORY "${dir}")
      # 获取目录内容（包括隐藏文件和子目录）
      file(GLOB dir_contents LIST_DIRECTORIES true "${dir}/*" "${dir}/.*")
      # 移除"."和".."目录
      list(REMOVE_ITEM dir_contents "${dir}/." "${dir}/..")
      list(LENGTH dir_contents num_contents)
      
      # 如果目录为空则删除
      if(num_contents EQUAL 0)
        message(STATUS "Removing empty directory: ${dir}")
        file(REMOVE_RECURSE "${dir}")
        if(IS_DIRECTORY "${dir}")
          message(STATUS "Failed to remove directory: ${dir}")
        else()
          math(EXPR removed_dirs "${removed_dirs} + 1")
        endif()
      endif()
    endif()
  endforeach()
  
  # 第二遍：检查父目录是否变为空目录
  foreach(dir ${dir_list})
    get_filename_component(parent_dir "${dir}" DIRECTORY)
    while(parent_dir AND IS_DIRECTORY "${parent_dir}")
      file(GLOB parent_contents LIST_DIRECTORIES true "${parent_dir}/*" "${parent_dir}/.*")
      list(REMOVE_ITEM parent_contents "${parent_dir}/." "${parent_dir}/..")
      list(LENGTH parent_contents num_parent_contents)
      
      # 如果父目录变为空则删除
      if(num_parent_contents EQUAL 0)
        message(STATUS "Removing now-empty parent directory: ${parent_dir}")
        file(REMOVE_RECURSE "${parent_dir}")
        if(IS_DIRECTORY "${parent_dir}")
          message(STATUS "Failed to remove directory: ${parent_dir}")
        else()
          math(EXPR removed_dirs "${removed_dirs} + 1")
        endif()
      else()
        break()  # 如果父目录不为空则停止
      endif()
      
      get_filename_component(parent_dir "${parent_dir}" DIRECTORY)
    endwhile()
  endforeach()
  
  # 返回删除的目录数量
  set(removed_dirs ${removed_dirs} PARENT_SCOPE)
endfunction()

# 调用增强版的目录清理函数
remove_empty_directories("${directories_to_check}")

# 获取删除的目录数量
if(DEFINED removed_dirs)
  message(STATUS "Removed ${removed_dirs} empty directories")
endif()

message(STATUS "Uninstall completed")
